import { Context, Schema } from 'koishi'
import { TcpClient } from './tcp_client'
import { MessageHandler } from './message-handler'

export const name = 'panda-onebot-bridge'

/**
 * 插件配置接口
 */
export interface Config {
  /** 熊猫群聊服务器地址 */
  host: string
  /** 熊猫群聊服务器端口 */
  port: number
  /** 是否启用调试日志 */
  debug: boolean
  /** 重连间隔（毫秒） */
  reconnectInterval: number
  /** 最大重连次数 */
  maxReconnectAttempts: number
}

/**
 * 配置模式定义
 */
export const Config: Schema<Config> = Schema.object({
  host: Schema.string().default('127.0.0.1').description('熊猫群聊服务器地址'),
  port: Schema.number().default(19730).description('熊猫群聊服务器端口'),
  debug: Schema.boolean().default(false).description('是否启用调试日志'),
  reconnectInterval: Schema.number().default(5000).description('重连间隔（毫秒）'),
  maxReconnectAttempts: Schema.number().default(10).description('最大重连次数（0为无限重连）'),
})

/**
 * 插件主函数
 * @param ctx Koishi上下文
 * @param config 插件配置
 */
export function apply(ctx: Context, config: Config) {
  const logger = ctx.logger('panda-onebot-bridge')
  
  // 创建TCP客户端
  const tcpClient = new TcpClient(config.host, config.port)

  // 创建消息处理器
  const messageHandler = new MessageHandler(ctx, tcpClient)

  // 插件启动时连接到熊猫群聊服务器
  ctx.on('ready', () => {
    logger.info('插件启动，正在连接到熊猫群聊服务器...')
    try {
      tcpClient.connect()
      logger.info(`正在连接到熊猫群聊服务器 ${config.host}:${config.port}`)
    } catch (error) {
      logger.error('连接熊猫群聊服务器失败:', error)
    }
  })

  // 插件停止时断开连接
  ctx.on('dispose', () => {
    logger.info('插件停止，断开与熊猫群聊服务器的连接')
    tcpClient.disconnect()
  })

  // 添加调试命令（仅在调试模式下可用）
  if (config.debug) {
    ctx.command('panda-bridge-status', '查看熊猫群聊桥接状态')
      .action(async ({ session }) => {
        const isConnected = tcpClient.isConnectedToServer
        const isOnline = await messageHandler.getOnlineStatus()
        return `连接状态: ${isConnected ? '已连接' : '未连接'}\n在线状态: ${isOnline ? '在线' : '离线'}`
      })

    ctx.command('panda-bridge-reconnect', '重新连接熊猫群聊服务器')
      .action(({ session }) => {
        try {
          tcpClient.disconnect()
          tcpClient.connect()
          return '重连成功'
        } catch (error) {
          logger.error('重连失败:', error)
          return '重连失败: ' + error.message
        }
      })
  }

  logger.info('熊猫群聊OneBot桥接插件已加载')
}
